import re
from users.models import User


# 默认jwt_response_payload_handler（）方法只返回token,重写返回多值
def jwt_response_payload_handler(token, user=None, request=None):
    """自定义jwt认证成功返回数据"""

    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }


# 自定义Django认证后端类
from django.contrib.auth.backends import ModelBackend


def get_user_by_account(account):
    """
       根据用户名或手机号查询用户信息
       account: 用户名或手机号
    """
    try:
        if re.match(r'^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$', account):
            user = User.objects.get(mobile=account)
        else:
            user = User.objects.get(username=account)
    except User.DoesNotExist:
        return None
    else:
        return user


# 重写authenticate方法,实现手机号和用户号两种方式同时可以登陆登录
class UsernameMobileAuthBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
               进行用户登录验证时登录账户支持用户名和手机号
               username: 用户名或手机号
               password: 登录密码
               """
        # 根据用户名或手机号查询用户信息
        user = get_user_by_account(username)
        # 如果存在user，校验用户的密码
        if user and user.check_password(password):
            # 校验成功
            return user
